package com.kamistoat.common.valid;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

// 自定义校验注解，为被标注的字段提供限制值，例如@ListValue(vals={1,2})就是限制字段的值只能为1或者2
// 以下四个注解都是直接从@NotNull复制过来的。
// 只需要修改@Constraint注解的内容，这个注解用于绑定这个自定义注解的实现类.class
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {ListValueConstraintValidation.class}
)
public @interface ListValue {


    // 1、新建这个注解之后，首先添加vals字段的定义，它将作为这个自定义注解的私有变量，显然我可以指定default值，但也可以不指定
    int[] vals() default {};

    // 以下三行代码也是直接从@NotNULL复制过来的，然后进行修改

    // 2、指定默认的message字段的值来自哪里，这个值应该在Resources下的ValidationMessages.properties中进行配置，注意这个配置文件的名称不能改，必须是这个
    // 在ValidationMessages.properties中配置这个值，名称就是com.kamistoat.common.valid.ListValue.message，当然我也可以直接在这里写，没有任何问题
    // 当然每次使用@ListValue注解的时候，如果我加上message字段来指定提示信息，这个默认信息就无效了
    String message() default "{com.kamistoat.common.valid.ListValue.message}";

    // 3、然后为@Constraint注解编写自定义类ListValueConstraintValidation，你可以理解为是@ListValue需要一个实现类
    // 4、然后在上面的@Constraint注解中，把ListValueConstraintValidation填进validatedBy = {}中，实现绑定

    // 默认分组，最好不要写，每次在使用@ListValue时直接使用group字段指定
    Class<?>[] groups() default {};

    // 暂时不知道怎么用
    Class<? extends Payload>[] payload() default {};


}
